/**
 * 枚举管理器
 * 用于管理系统枚举常量
 */

/**
 * 卡片类型枚举
 */
export const CardType = {
  NORMAL: 1,      // 普通卡
  VIP: 2,         // VIP卡
  DIAMOND: 3,     // 钻石卡
  BLACK_GOLD: 4   // 黑金卡
}

/**
 * 卡片状态枚举
 */
export const CardStatus = {
  NORMAL: 1,      // 正常
  FROZEN: 2,      // 冻结
  CANCELLED: 3,   // 注销
  LOST: 4         // 挂失
}

/**
 * 调解状态枚举
 */
export const MediationStatus = {
  PENDING: 1,     // 待受理
  PROCESSING: 2,  // 调解中
  SUCCESS: 3,     // 调解成功
  FAILED: 4,      // 调解失败
  CANCELLED: 5    // 已撤销
}

/**
 * 通知类型枚举
 */
export const NoticeType = {
  SYSTEM: 1,      // 系统通知
  GOVERNMENT: 2,  // 政府公告
  EDUCATION: 3,   // 教育培训
  FEEDBACK: 4     // 意见反馈
}

/**
 * 部门枚举
 */
export const Department = {
  MANAGEMENT: 1,  // 管理部
  FINANCE: 2,     // 财务部
  HR: 3,          // 人事部
  TECH: 4,        // 技术部
  MARKETING: 5,   // 市场部
  SERVICE: 6      // 客服部
}

/**
 * 职位枚举
 */
export const Position = {
  CEO: 1,         // 总经理
  VICE_CEO: 2,    // 副总经理
  MANAGER: 3,     // 部门经理
  SUPERVISOR: 4,  // 主管
  SPECIALIST: 5,  // 专员
  ASSISTANT: 6    // 助理
}

/**
 * 性别枚举
 */
export const Gender = {
  UNKNOWN: 0,     // 未知
  MALE: 1,        // 男
  FEMALE: 2       // 女
}

/**
 * 审核状态枚举
 */
export const AuditStatus = {
  PENDING: 0,     // 待审核
  APPROVED: 1,    // 审核通过
  REJECTED: 2     // 审核拒绝
}

/**
 * 启用状态枚举
 */
export const EnableStatus = {
  DISABLED: 0,    // 禁用
  ENABLED: 1      // 启用
}

/**
 * 优先级枚举
 */
export const Priority = {
  LOW: 1,         // 低
  MEDIUM: 2,      // 中
  HIGH: 3,        // 高
  URGENT: 4       // 紧急
}

/**
 * 文件类型枚举
 */
export const FileType = {
  IMAGE: 'image',       // 图片
  DOCUMENT: 'document', // 文档
  VIDEO: 'video',       // 视频
  AUDIO: 'audio',       // 音频
  ARCHIVE: 'archive'    // 压缩包
}

/**
 * HTTP状态码枚举
 */
export const HttpStatus = {
  OK: 200,                    // 成功
  CREATED: 201,               // 已创建
  NO_CONTENT: 204,            // 无内容
  BAD_REQUEST: 400,           // 请求错误
  UNAUTHORIZED: 401,          // 未授权
  FORBIDDEN: 403,             // 禁止访问
  NOT_FOUND: 404,             // 未找到
  METHOD_NOT_ALLOWED: 405,    // 方法不允许
  CONFLICT: 409,              // 冲突
  INTERNAL_SERVER_ERROR: 500, // 服务器内部错误
  BAD_GATEWAY: 502,           // 网关错误
  SERVICE_UNAVAILABLE: 503    // 服务不可用
}

/**
 * 业务状态码枚举
 */
export const BusinessCode = {
  SUCCESS: 200,               // 成功
  PARAM_ERROR: 400,           // 参数错误
  UNAUTHORIZED: 401,          // 未授权
  FORBIDDEN: 403,             // 禁止访问
  NOT_FOUND: 404,             // 数据不存在
  CONFLICT: 409,              // 数据冲突
  BUSINESS_ERROR: 500,        // 业务错误
  SYSTEM_ERROR: 999           // 系统错误
}

/**
 * 存储类型枚举
 */
export const StorageType = {
  LOCAL: 'localStorage',      // 本地存储
  SESSION: 'sessionStorage'   // 会话存储
}

/**
 * 主题枚举
 */
export const Theme = {
  LIGHT: 'light',             // 浅色主题
  DARK: 'dark',               // 深色主题
  AUTO: 'auto'                // 自动主题
}

/**
 * 语言枚举
 */
export const Language = {
  ZH_CN: 'zh-CN',             // 简体中文
  EN_US: 'en-US'              // 英语
}

/**
 * 枚举工具类
 */
export class EnumUtils {
  /**
   * 获取枚举的所有键
   * @param {object} enumObj - 枚举对象
   * @returns {Array} 键数组
   */
  static getKeys(enumObj) {
    return Object.keys(enumObj)
  }

  /**
   * 获取枚举的所有值
   * @param {object} enumObj - 枚举对象
   * @returns {Array} 值数组
   */
  static getValues(enumObj) {
    return Object.values(enumObj)
  }

  /**
   * 检查值是否在枚举中
   * @param {object} enumObj - 枚举对象
   * @param {any} value - 要检查的值
   * @returns {boolean} 是否存在
   */
  static hasValue(enumObj, value) {
    return Object.values(enumObj).includes(value)
  }

  /**
   * 根据值获取键
   * @param {object} enumObj - 枚举对象
   * @param {any} value - 枚举值
   * @returns {string|undefined} 枚举键
   */
  static getKeyByValue(enumObj, value) {
    return Object.keys(enumObj).find(key => enumObj[key] === value)
  }

  /**
   * 将枚举转换为选项数组
   * @param {object} enumObj - 枚举对象
   * @param {object} labelMap - 标签映射
   * @returns {Array} 选项数组
   */
  static toOptions(enumObj, labelMap = {}) {
    return Object.keys(enumObj).map(key => ({
      label: labelMap[key] || key,
      value: enumObj[key]
    }))
  }

  /**
   * 将枚举转换为映射对象
   * @param {object} enumObj - 枚举对象
   * @param {object} labelMap - 标签映射
   * @returns {object} 映射对象
   */
  static toMap(enumObj, labelMap = {}) {
    const map = {}
    Object.keys(enumObj).forEach(key => {
      map[enumObj[key]] = labelMap[key] || key
    })
    return map
  }
}

/**
 * 常用枚举标签映射
 */
export const EnumLabels = {
  CardType: {
    NORMAL: '普通卡',
    VIP: 'VIP卡',
    DIAMOND: '钻石卡',
    BLACK_GOLD: '黑金卡'
  },
  CardStatus: {
    NORMAL: '正常',
    FROZEN: '冻结',
    CANCELLED: '注销',
    LOST: '挂失'
  },
  MediationStatus: {
    PENDING: '待受理',
    PROCESSING: '调解中',
    SUCCESS: '调解成功',
    FAILED: '调解失败',
    CANCELLED: '已撤销'
  },
  NoticeType: {
    SYSTEM: '系统通知',
    GOVERNMENT: '政府公告',
    EDUCATION: '教育培训',
    FEEDBACK: '意见反馈'
  },
  Department: {
    MANAGEMENT: '管理部',
    FINANCE: '财务部',
    HR: '人事部',
    TECH: '技术部',
    MARKETING: '市场部',
    SERVICE: '客服部'
  },
  Position: {
    CEO: '总经理',
    VICE_CEO: '副总经理',
    MANAGER: '部门经理',
    SUPERVISOR: '主管',
    SPECIALIST: '专员',
    ASSISTANT: '助理'
  },
  Gender: {
    UNKNOWN: '未知',
    MALE: '男',
    FEMALE: '女'
  },
  AuditStatus: {
    PENDING: '待审核',
    APPROVED: '审核通过',
    REJECTED: '审核拒绝'
  },
  EnableStatus: {
    DISABLED: '禁用',
    ENABLED: '启用'
  },
  Priority: {
    LOW: '低',
    MEDIUM: '中',
    HIGH: '高',
    URGENT: '紧急'
  }
}